package org.example.leetCode;

import java.util.HashMap;
import java.util.Objects;

/**
 * 150. 逆波兰表达式求值
 * 给你一个字符串数组 tokens ，表示一个根据 逆波兰表示法 表示的算术表达式。
 * 请你计算该表达式。返回一个表示表达式值的整数。
 * <p>
 * 注意：
 * 有效的算符为 '+'、'-'、'*' 和 '/' 。
 * 每个操作数（运算对象）都可以是一个整数或者另一个表达式。
 * 两个整数之间的除法总是 向零截断 。
 * 表达式中不含除零运算。
 * 输入是一个根据逆波兰表示法表示的算术表达式。
 * 答案及所有中间计算结果可以用 32 位 整数表示。
 */
public class Code150 {
    public int evalRPN(String[] tokens) {
        HashMap<String, String> map = new HashMap<>();
        map.put("+", "+");
        map.put("-", "-");
        map.put("*", "*");
        map.put("/", "/");
        String[] token = new String[tokens.length];
        int top = -1;
        for (int i = 0; i < tokens.length; i++) {
            String str = tokens[i];
            if (map.containsKey(str)) {
                int left = Integer.parseInt(token[top - 1]);
                int right = Integer.parseInt(token[top]);
                if (Objects.equals(str, "+")) {
                    token[top - 1] = String.valueOf(left + right);
                } else if (Objects.equals(str, "-")) {
                    token[top - 1] = String.valueOf(left - right);
                } else if (Objects.equals(str, "*")) {
                    token[top - 1] = String.valueOf(left * right);
                } else if (Objects.equals(str, "/")) {
                    token[top - 1] = (String.valueOf(left / right));
                }
                top--;
            } else {
                token[++top] = str;
            }
        }
        return Integer.parseInt(token[0]);
    }
}
